<?php
/**
 *  User：LRZ
 *  Date：2020/1/22
 *  Time：23:35
 */

/**
 *  1128.等价多米诺骨牌对的数量
 *
 *  标签：数组
 *
 *  给你一个由一些多米诺骨牌组成的列表 dominoes。
 *  如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌，我们就认为这两张牌是等价的。
 *  形式上，dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d，或是 a==d 且 b==c。
 *  在 0 <= i < j < dominoes.length 的前提下，找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量。
 *
 *  示例：
 *      输入：dominoes = [[1,2],[2,1],[3,4],[5,6]]
 *      输出：1
 *   
 *  提示：
 *      1 <= dominoes.length <= 40000
 *      1 <= dominoes[i][j] <= 9
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/number-of-equivalent-domino-pairs
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$dominoes = [[1, 2], [2, 1], [3, 4], [5, 6]];
$res      = numEquivDominoPairs($dominoes);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function numEquivDominoPairs($dominoes)
{
    $size = count($dominoes);

    if ($size <= 0) {
        return false;
    }

    $res  = 0;
    $hash = [];

    foreach ($dominoes as $k => $v) {
        sort($v);
        $temp = $v[0] * 10 + $v[1];
        if (isset($hash[$temp])) {
            $res += $hash[$temp];
            $hash[$temp]++;
        } else {
            $hash[$temp] = 1;
        }
    }
    return $res;
}